package com.hc.springbootrabbitmq.common;

public class RabbitMQHelper {
    /**
     * 1.为何要使用消息服务
     *      1）异步处理
     *      2）应用解耦
     *      3）流量削峰
     *      4）分布式事务管理
     * 2.常用消息中间件
     *      1）ActiveMQ：JMS规范，支持事务，官方维护越来越少
     *      2）Kafka：高性能，高可用，尤其适合日志收集这种庞大的使用场景
     *      3）RabbitMQ：支持高并发，性能好，erlang语言开发，不利于java二次开发
     *      4）RocketMQ：高可用，高可靠，方便java二次开发
     * 3.RabbitMQ核心组件
     *      1）Publisher：消息发布者
     *      2）Consumer：消息消费者
     *      3）Exchange：交换器
     *      4）Queue：消息队列
     *      5）Channel：信道
     *      6）VirtualHost：虚拟主机
     * 4.RabbitMQ工作模式
     *      1）简单模式
     *      2）工作队列模式
     *      3）发布订阅模式
     *      4）路由模式
     *      5）主题模式
     *      6）远程过程调用模式
     *      7）发布者确认模式
     * 5.RabbitMQ安装
     *      1）erl -version查看Erlang，没有则安装 rpm -ivh erlang-xxx.rpm
     *      2）yum info socat查看Socat，没有则安装 rpm -ivh socat-xxx.rpm
     *      3）安装RabbitMQ rpm -ivh rabbitmq-xxx.rpm
     *      4）可视化插件安装yum -y install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++
     *               kernel-devel m4 ncurses-devel tk tc xz glibc-devel xmlto perl gtk2-devel binutils-devel
     *         启动插件rabbitmq-plugins enable rabbitmq_management 默认账号密码guest
     *      5）直接启动rabbitmq-server
     *         后台启动rabbitmq-server -detached
     *         启动服务rabbitmq-server start
     *         重启服务rabbitmq-server restart
     *         查看状态rabbitmqctl status
     *         停止服务rabbitmqctl stop
     *      6）创建可视化终端普通用户并配置权限及相关命令
     *         rabbitmqctl add_user admin 123456 创建账号和密码
     *         rabbitmqctl set_user_tags admin administrator 分配账号权限
     *         rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" 设置可远程登录
     *         rabbitmqctl list_user_permissions admin 查看用户权限
     *         rabbitmqctl list_permissions -p / 查看能被哪些用户访问
     *         rabbitmqctl list_users 查看用户列表
     *         rabbitmqctl change_password admin 123 修改用户密码
     * 6.消息确认机制
     *      1）RabbitMQ等待消费方返回一个确认的信号才从消息队列中将消息删除
     * 7.死信
     *      无法被正常消费的消息
     *      1）消息接收时被拒绝且不再重复发送
     *      2）队列中超过过期时间的消息
     *      3）未入队列的消息
     * 8.延迟队列
     *      队列里的消息不需要立即消费，等待一段时间再消费，死信队列+消息过期时间
     * -----面试题-----
     * 1.RabbitMQ持久化
     *      1）队列持久化：创建队列时通过参数指定
     *      2）交换器持久化：创建交换器时通过参数指定
     *      3）消息持久化：创建消息时通过参数指定
     *      通过追加的方式写文件，并根据文件大小自动切割文件，RabbitMQ会启动两个进程，一个进程负责队列、交换器、消息的持久化
     *      另一个进行负责非持久化的消息在内存不足时的持久化
     * 2.RabbitMQ事务消息
     *      1）信道通知服务开启事务，服务返回开启成功
     *      2）信道发送消息并提交事务
     *      3）出现异常则回滚事务
     * 3.RabbitMQ如何保证消息的可靠性传输
     *      1）事务消息
     *      2）消息确认机制
     *          1.发送方：生产者发送消息给信道，若信息接收成功，则发送ack给生产者，
     *                  若失败，则发送nack给生产者，成功失败都回调ConfirmCallback，
     *                  消息从交换器发送至队列失败时回调returnedMessage
     *          2.接收方：手动签收时，服务会等待消费方返回ack才删除消息，否则不删除，
     *                   ack没有超时机制，只判断连接是否断开，若断开，则消息可被重新发送
     * 4.如何保证消息不被重复消费
     *      1）站在MQ角度无法保证，因为ack返回可能会发生宕机或网络异常导致返回失败
     *      2）站在消费端，则需保证相同的请求结果相同
     * 5.如何解析消息堆积问题
     *      1）增加消费者数量
     *      2）优化消费者性能
     *      3）调整队列大小
     *      4）使用死信队列
     *      5）控制消息的生产速度
     */
}
